{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Dualing DQN\n",
    "\n",
    "**Paper**: [Dueling Network Architectures for Deep Reinforcement Learning](https://arxiv.org/pdf/1511.06581.pdf)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import gym\n",
    "\n",
    "\n",
    "from src.utils.Config import Config\n",
    "from src.utils.Logging import Logger\n",
    "from src.components.memory import ReplayBuffer\n",
    "\n",
    "from src.utils.misc import train, watch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DualingQNetwork(nn.Module):\n",
    "    def __init__(self, state_size, action_size, seed, fc1_units=64, fc2_units=64):\n",
    "    # Call inheritance\n",
    "    super(DualingQNetwork, self).__init__()\n",
    "    self.seed = torch.manual_seed(1234)\n",
    "\n",
    "    self.feature = nn.Sequential(\n",
    "        nn.Linear(state_size, fc1_units),\n",
    "        nn.ReLU()\n",
    "    )\n",
    "\n",
    "    self.advantage = nn.Sequential(\n",
    "        nn.Linear(fc1_units, fc2_units),\n",
    "        nn.ReLU(),\n",
    "        nn.Linear(fc2_units, action_size)\n",
    "    )\n",
    "\n",
    "    self.value = nn.Sequential(\n",
    "        nn.Linear(fc1_units, fc2_units),\n",
    "        nn.ReLU(),\n",
    "        nn.Linear(fc2_units, 1)\n",
    "    )\n",
    "\n",
    "    def forward(self, state):\n",
    "    x = self.feature(state)\n",
    "\n",
    "    advantage = self.advantage(x)\n",
    "    value = self.value(x)\n",
    "\n",
    "    x = value + advantage - advantage.mean()\n",
    "\n",
    "    return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: \t\tEnvSpec(CartPole-v1)\n",
      "win condition: \t1905.0\n",
      "state space\t(4,)\n",
      "action space\t2\n",
      "device: \tcpu\n",
      "seed: \t\t123456789\n",
      "n_episodes: \t2000\n",
      "max_t: \t\t1000\n",
      "eps_start: \t1.0\n",
      "eps_end: \t0.01\n",
      "eps_decay: \t0.995\n",
      "eps_greedy: \tTrue\n",
      "noisy: \t\tFalse\n",
      "tau: \t\t0.001\n",
      "gamma: \t\t0.99\n",
      "lr: \t\t0.0005\n",
      "memory: \t<class 'src.components.memory.ReplayBuffer'>\n",
      "batch_size: \t64\n",
      "buffer_size: \t100000\n",
      "lr_annealing: \tFalse\n",
      "learn_every: \t4\n",
      "double_dqn: \tTrue\n",
      "model: \t\t<class 'src.networks.models.DualingQNetwork'>\n",
      "save_loc: \tNone\n",
      "Logging at: logs/CartPole-v1/experiment-2020-04-16_15_19_48\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/gym/envs/registration.py:14: PkgResourcesDeprecationWarning: Parameters to load are deprecated.  Call .resolve and .require separately.\n",
      "  result = entry_point.load(False)\n"
     ]
    }
   ],
   "source": [
    "config = Config()\n",
    "\n",
    "config.env = gym.make('CartPole-v1')\n",
    "\n",
    "config.win_condition = 195.0\n",
    "config.memory = ReplayBuffer\n",
    "config.model = DualingQNetwork\n",
    "config.double_dqn = True\n",
    "config.print_config()\n",
    "\n",
    "logger = Logger(config)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epi: 100\tAverage Score: 23.5800\tMean: 20.0000\tDuration: 0.0421\t#t_s: 19.0000\n",
      "Epi: 200\tAverage Score: 22.9500\tMean: 29.0000\tDuration: 0.0734\t#t_s: 28.0000\n",
      "Epi: 300\tAverage Score: 71.6400\tMean: 178.0000\tDuration: 0.3558\t#t_s: 177.0000\n",
      "Epi: 400\tAverage Score: 218.8600\tMean: 208.0000\tDuration: 0.4368\t#t_s: 207.0000\n",
      "Epi: 500\tAverage Score: 237.9200\tMean: 246.0000\tDuration: 0.5146\t#t_s: 245.0000\n",
      "Epi: 600\tAverage Score: 234.7300\tMean: 214.0000\tDuration: 0.6117\t#t_s: 213.0000\n",
      "Epi: 700\tAverage Score: 258.4600\tMean: 266.0000\tDuration: 0.5710\t#t_s: 265.0000\n",
      "Epi: 800\tAverage Score: 398.4100\tMean: 273.0000\tDuration: 0.6383\t#t_s: 272.0000\n",
      "Epi: 900\tAverage Score: 292.6700\tMean: 170.0000\tDuration: 0.3603\t#t_s: 169.0000\n",
      "Epi: 1000\tAverage Score: 164.5600\tMean: 129.0000\tDuration: 0.3489\t#t_s: 128.0000\n",
      "Epi: 1100\tAverage Score: 141.9300\tMean: 132.0000\tDuration: 0.2869\t#t_s: 131.0000\n",
      "Epi: 1200\tAverage Score: 139.7400\tMean: 137.0000\tDuration: 0.2972\t#t_s: 136.0000\n",
      "Epi: 1300\tAverage Score: 125.9100\tMean: 167.0000\tDuration: 0.3558\t#t_s: 166.0000\n",
      "Epi: 1400\tAverage Score: 127.2300\tMean: 120.0000\tDuration: 0.2737\t#t_s: 119.0000\n",
      "Epi: 1500\tAverage Score: 136.0900\tMean: 130.0000\tDuration: 0.4334\t#t_s: 129.0000\n",
      "Epi: 1600\tAverage Score: 124.4900\tMean: 122.0000\tDuration: 0.2531\t#t_s: 121.0000\n",
      "Epi: 1700\tAverage Score: 126.7400\tMean: 127.0000\tDuration: 0.2702\t#t_s: 126.0000\n",
      "Epi: 1800\tAverage Score: 131.2400\tMean: 128.0000\tDuration: 0.2646\t#t_s: 127.0000\n",
      "Epi: 1900\tAverage Score: 128.2700\tMean: 123.0000\tDuration: 0.3287\t#t_s: 122.0000\n",
      "Epi: 2000\tAverage Score: 128.5500\tMean: 157.0000\tDuration: 0.3342\t#t_s: 156.0000\n"
     ]
    }
   ],
   "source": [
    "train(config, logger)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11f470080>]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(logger.score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "watch(config, logger.log_file_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
